package co.com.pd.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;


import co.com.pd.dao.DispositivoDaoInt;
import co.com.pd.dao.cfg.HibernateSessionFactory;
import co.com.pd.dtos.DispositivoDto;
import co.com.pd.exception.DaoException;
/**
 * 
 * @author Usuario
 *Implementacion de la logica del usuario 
 */

public class DispositivoDaoImpl implements DispositivoDaoInt {

	/**
	 * Guarda el usario para la clase usaurio.
	 */
	@Override
	public void guardar(DispositivoDto dispositivoDto)  throws DaoException {
		
	
		Session session = null;
		Transaction tx = null;
		/**
		 * creacion de la logica para la persistencia de un nuevo sipositivo 
		 */
		try{
			/**
			 * Inicializacion del ssecion factory 
			 */
			session = HibernateSessionFactory.getInstance().getSession();
			tx = session.beginTransaction();
			session.save(dispositivoDto);
			tx.commit();
			
			
		}catch(HibernateException e){
			
			throw new  DaoException(e);
		}finally{
			if(session != null)
				session.close();
		}
		
	}
	
	/**
	 * realizacion de la logica para obtener un dispositivo por medio del serial.
	 */
	@Override
	public DispositivoDto obtener(String serial)  {
		Session session = null;
		DispositivoDto dispositivoDto = null;
		/**
		 * Logica de inciciacion del factory y retorno del un unico dispositivo por medio de serial
		 */
		try{
			session = HibernateSessionFactory.getInstance().getSession();
			
			dispositivoDto = (DispositivoDto)session.get(DispositivoDto.class, serial);
			
		/**
		 * 	Manejo de las ecepciones 
		 */
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(session != null)
				session.close();
		}
		return dispositivoDto;
	}

	/**
	 * Realizacion de la logica para realizar  actualizacion de un dispositivo
	 */
	@Override
	public void actualizar(DispositivoDto dispositivoDto)  {
		Session session = null;
		Transaction tx = null;
		
		/**
		 * creacion de la logica para la acutalizacion de Dispositivo
		 */
		
		try{
			session = HibernateSessionFactory.getInstance().getSession();
			
			tx = session.beginTransaction();
			session.update(dispositivoDto);
			tx.commit();
			
			/**
			 * Manejo de las excepciones
			 */
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(session != null)
				session.close();
		}

	}
/**
 * Implemenaticon de la logica para eliminar un Dispositivo de la persistencia
 */
	@Override
	public void elimnar(DispositivoDto dispositivoDto)  {
		Session session = null;
		Transaction tx = null;
		
		/**
		 * Realizacion de la logica para borrado del Dispositivo unico
		 */
		try{
			session = HibernateSessionFactory.getInstance().getSession();
			
			tx = session.beginTransaction();
			session.delete(dispositivoDto);
			tx.commit();
			
			/**
			 * Manejo de las excepciones
			 */
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(session != null)
				session.close();
		}

	}

	
/**
 * Implementacion de la logica para la obtencion de una lista de dispositivos 
 * en el cual su estado se encuentre disponible.
 */
	@Override
	public List<DispositivoDto> obtenerDispositivos( )  {
		Session session = null;
		List<DispositivoDto> listaDispositivos = new ArrayList<DispositivoDto>();
		
		try{
			/**
			 * se btiene la session del fatctoty se crea el query y se ejecuta para obtenes la lista de los
			 * Dispositivos disponibles
			 */
			session = HibernateSessionFactory.getInstance().getSession();
			Query query = session.createQuery(" FROM DispositivoDto d WHERE d.estado = 'Disponible' ");
			listaDispositivos = query.list();
			
			 /**
			  * 
			  */
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(session != null)
				session.close();
		}
		return listaDispositivos;
	}
	
	
	/**
	 * Implementacion de la logica para la obtencion de una lista de dispositivos 
	 * en el cual su estado se encuentre no disponible.
	 */
		@Override
		public List<DispositivoDto> obtenerDispositivosPrestados( )  {
			Session session = null;
			List<DispositivoDto> listaDispositivos = new ArrayList<DispositivoDto>();
			
			try{
				/**
				 * se btiene la session del fatctoty se crea el query y se ejecuta para obtenes la lista de los
				 * Dispositivos no disponibles
				 */
				session = HibernateSessionFactory.getInstance().getSession();
				Query query = session.createQuery(" FROM DispositivoDto d WHERE d.estado = 'NoDisponible' ");
				listaDispositivos = query.list();
				
				 /**
				  * 
				  */
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				if(session != null)
					session.close();
			}
			return listaDispositivos;
		}



	
	
	
}
